/* vim: set ts=8 sw=8 cindent: **************************************************
*										*
*  Copyright (c) 2007-2013, Alexander Adam					*
*										*
*  All rights reserved.								*
*										*
*  Redistribution and use in source and binary forms, with or without		*
*  modification, are permitted provided that the following conditions are met:	*
*										*
*	-	Redistributions of source code must retain the above copyright	*
*		notice, this list of conditions and the following disclaimer.	*
*	-	Redistributions in binary form must reproduce the above		*
*		copyright notice, this list of conditions and the following	*
*		disclaimer in the documentation and/or other materials provided	*
*		with the distribution.						*
*	-	The names of its contributors may be used to endorse or promote	*
*		products derived from this software without specific prior	*
*		written permission.						*
*										*
*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS		*
*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT		*
*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR	*
*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER	*
*  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,	*
*  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,		*
*  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR		*
*  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF	*
*  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING		*
*  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS		*
*  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.			*
*										*
********************************************************************************/

#include <iostream>
#include "sortbase.h"

/*!
 * Konstruktor der Sortierbasisklasse.
 */
SORTBASE_API bench::SortBase::SortBase()
{}

/*!
 * Destruktor der Sortierbasisklasse.
 */
SORTBASE_API bench::SortBase::~SortBase()
{
	this->feld.clear();
}

/*!
 * Vorbereitungsfunktion. Sie initialisiert das zu sortierende Feld mit Werten.
 * Sie wird vor der Zeitmessung aufgerufen.
 *	\param	x	Feld mit Werten, mit dem initialisiert wird
 */
SORTBASE_API void bench::SortBase::pre( const bench::feld_t &x)
{
	this->feld = x;
}

/*!
 * Diese Funktion wird fuer das Sortieren aufgerufen. Sie muss implementiert
 * werden.
 */
void SORTBASE_API bench::SortBase::sort()
{}

/*!
 * Diese Funktion wird zwischen der Messung und dem Pruefen, ob das Ergebnis der
 * Sortierung korrekt war, aufgerufen. Hier besteht die prinzipielle
 * Moeglichkeit, aus einer internen Darstellung zurueck in das Feld zu kopieren.
 * \remark	Diese Funktion schraenkt die Vergleichbarkeit von Algorithmen
 * 		ein, wenn sie benoetigt wird. Alle bereits vorgegebenen
 * 		Algorithmen, auch die, die nicht auf dem Feld operieren, nutzen
 * 		diese Funktion nicht.
 */
void SORTBASE_API bench::SortBase::post()
{}

/*!
 * Diese Testfunktion prueft, ob das interne Feld sortiert ist. Sie wird vom
 * Benchmark dazu genutzt, um die Funktionsfaehigkeit der Module zu pruefen.
 * \retval	true	wenn richtig sortiert wurde
 * \retval	false	wenn falsch sortiert wurde
 */
bool SORTBASE_API bench::SortBase::test()
{
	for (bench::feld_t::size_type i = 0; i < this->feld.size()-1; i++)
		if (this->feld[ i] > this->feld[ i+1])
			return false;

	return true;
}

/*!
 * Diese Funktion kann genutzt werden, um das interne Feld auzugeben. Sie
 * gibt das interne Feld nur bei einer maximalen Feldgroesse von 20 aus.
 */
void SORTBASE_API bench::SortBase::output( std::ostream& s)
{
	if (feld.size() < 20)
	{
		for (bench::feld_t::size_type i = 0; i < feld.size(); i++)
			s << feld[ i] << " ";
		s << std::endl;
	}
}
